package com.itheima.d1_staticdemo;

/**
 * 类变量：属于类，与类一起加载一次，在内存中只有一份，可以被类和类的所有对象共享。
 * 实例变量：属于对象，每个对象中都有一份，只能用对象访问。
 *
 * 分析：
 * test类加载到方法区，然后main方法到栈内存，然后执行第一行代码的时候，
 * 把student类加载到方法区，并且检查发现里面有类变量name，
 * 接着就会把类变量加载到堆内存，然后给类变量赋值
 *
 * 然后是s1变量会指向堆内存新创建的学生对象，并且学生对象里面会存放自己的实例变量age
 * 并且该对象会存储类的地址，然后通过s1没有找到学生对象里面的name，接着就会去学生类里面，找这个类变量
 *
 */
public class Test {
    public static void main(String[] args) {
        // 目标：掌握有无static修饰成员变量的用法，特点。
        // 1、类变量的用法。
        // 类名.类变量（推荐）
        Student.name = "袁华";
        System.out.println("Student.name： "+Student.name);

        // 对象.类变量（不推荐）
        Student s1 = new Student();
        s1.name = "马冬梅";
        System.out.println("s1.name: "+s1.name);

        Student s2 = new Student();
        s2.name = "秋雅";
        System.out.println("s2.name: "+s2.name);


        System.out.println("===================");

        //为什么会乱码？   不乱码了，改了file encoding里面的project encoding为utf-8
        //s1瀵硅薄璋冪敤闈欐�佺殑name鎴愬憳鍙橀噺: 绉嬮泤
        System.out.println("s1对象调用静态的name成员变量: "+s1.name); // 秋雅
        //s2瀵硅薄璋冪敤闈欐�佺殑name鎴愬憳鍙橀噺: 绉嬮泤
        System.out.println("s2对象调用静态的name成员变量: "+s2.name); // 秋雅
        //Student.name绫诲悕璋冪敤闈欐�佹垚鍛樺彉閲弉ame绉嬮泤
        System.out.println("Student.name类名调用静态成员变量name"+Student.name); // 秋雅

        // 2、实例变量的用法：属于每个对象的变量
        // 对象.实例变量
        s1.age = 23;
        s2.age = 18;
        System.out.println(s1.age); // 23
        System.out.println(s2.age); // 18

        // System.out.println(Student.age); // 报错

        System.out.println("=============");

        s1.sex = "还乱码吗";
        System.out.println(s1.sex);

    }
}
